require 'digest/sha1'

class Content < ActiveRecord::Base
  has_and_belongs_to_many :tags

  # アクセサ
  attr_accessor :challenge_code
  attr_accessor :response_code

  # タグ名の羅列（カンマ区切り）
  attr_accessor :tag_names

  #
  # タグを保存する
  #
  def save_tags
    new_tag_names = self.tag_names.split(',').collect {|tagname| tagname.strip}
    self.tags.map do |tag|
      # 削除されたタグをDBから削除する
      self.tags.delete tag unless (new_tag_names.find{|new_tagname| new_tagname == tag.name})
    end

    # タグマスタから全タグを取得
    exist_tags = Tag.find(:all)
    new_tag_names.map do |new_tagname|
      # 既に登録済み以外のタグを追加する
      unless self.tags.find_by_name new_tagname then

        # タグ名がタグマスタに存在するか確認する
        exist_tag = exist_tags.find{|e_tag| e_tag.name == new_tagname}
        if exist_tag.class == Tag then
          self.tags.push exist_tag
        else
          self.tags.push Tag.create(:name => new_tagname)
        end
      end
    end
  end

  #
  # レンダラーを取得する
  #
  def self.get_renderer
    eval(DEFAULT_RENDERER.split('_').map{|w| w.capitalize}.join('') + 'Renderer.new')
  end
  def get_renderer
    Content.get_renderer
  end

  #
  # 保存前にrendererがコンテンツを整形する
  #
  def before_save
    renderer = Content.get_renderer
    self.body = renderer.before_save(self)
  end

  #
  # コンテンツをHTMLに変換してキャッシュに格納し、保存する
  #
  def convert_body
    # wikiレンダラーオブジェクトを取得
    renderer = Content.get_renderer
    # レンダリングを行い、キャッシュに保存する
    # キャッシュはコンテンツ更新時に削除される（削除する）
    self.cache = renderer.to_html_with_block(self)
#    unless self.cache
#      self.cache = renderer.to_html_with_block(self.body)
#      self.save
#    end
  end

  #
  # コンテンツをHTMLに変換して返す
  #
  def fetch_convert_body_with_block
    # wikiレンダラーオブジェクトを取得
    renderer = Content.get_renderer
    # レンダリングを行い、キャッシュに保存する
    # キャッシュはコンテンツ更新時に削除される（削除する）
    renderer.to_html_with_block(self)
  end

  #
  # コンテンツをHTMLに変換して返す
  #
  def fetch_convert_body_without_block
    # wikiレンダラーオブジェクトを取得
    renderer = Content.get_renderer
    # レンダリングを行い、キャッシュに保存する
    # キャッシュはコンテンツ更新時に削除される（削除する）
    renderer.to_html_without_block(self)
  end

  #
  # コンテンツをHTMLに変換して返す（その際、プラグインを削除する）
  #
  def fetch_convert_body_without_block_and_plugin
    body = ''
    self.body = self.body.each_line do |line|
      body += line unless line =~ /^#.*$/
    end
    self.body = body
    p body
    fetch_convert_body_without_block
  end

  #
  #
  #
  def wikitext_to_html
  end

protected
  def validate
    errors.add_on_empty %w( title )
    errors.add("title", "はすでに使用されています") unless check_title_duplication
    errors.add("title", "に次の記号は使用できません[ #%?./ ]") unless check_title_string
    errors.add("password", "が不正です") unless check_challenge_response
  end

  #
  # タイトルに使用不可な記号を使用しているかチェック
  #
  def check_title_string
    unless self.title =~ /[#%?.\/]/ then
      return true
    else
      return false
    end
  end

  #
  # タイトルが重複していたらfalseを返す
  #
  def check_title_duplication
    content = Content.find_by_title(self.title)

    return true unless content

    if (self.id && (content.id == self.id)) then
      return true
    else
      return false
    end
  end

  #
  # チャレンジレスポンスコードの認証を行う
  #
  def check_challenge_response

    if self.id.nil? then

      # 凍結状態の場合、パスワードをチェックし、送信された凍結フラグを使用する
      if (self.freeze_flag.to_i == 1) then
        return @challenge_code == @response_code
      else
        return true
      end

    else
      org_content = Content.find(self.id)
      # 凍結状態の場合、パスワードをチェックし、送信された凍結フラグを使用する
      if (org_content.freeze_flag == 1) || (self.freeze_flag.to_i == 1) then
        return @challenge_code == @response_code
      else
        return true
      end
    end

  end
end
